package co.com.corbeta.logica;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import co.com.corbeta.constantes.Mensajes;
import co.com.corbeta.excepcion.LeerPropiedadesException;

/**
 * Clase encargada de realizar la lectura de un archivo de propiedades
 * 
 * @author Diego A. Galindo
 * @since 1.0 16/07/2014
 * */
public class ArchivoProperties {
    // Ruta del archivo de propiedades
    private String rutaArchivo;
    // Propiedades cargadas desde el archivo efe
    private Properties propiedades;

    /**
     * Constructor
     * 
     * @param rutaArchivo
     *            ruta en la que se encuentra el archivo de propiedades
     * @throws LeerPropiedadesException
     * */
    public ArchivoProperties(String rutaArchivo)
	    throws LeerPropiedadesException {

	if (rutaArchivo == null || rutaArchivo.length() == 0) {
	    throw new LeerPropiedadesException(
		    Mensajes.MENSAJE_NO_EXISTE_RUTA_PARA_ALOJAR_ARCHIVOS_PLANOS
			    .getMensaje());
	}

	this.rutaArchivo = rutaArchivo;
	this.propiedades = new Properties();

	try {
	    this.propiedades.load(new FileInputStream(this.rutaArchivo));
	} catch (FileNotFoundException e) {
	    throw new LeerPropiedadesException(
		    Mensajes.MENSAJE_NO_EXISTE_ARCHIVO_PROPIEDADES.getMensaje(),
		    e);
	} catch (IOException e) {
	    throw new LeerPropiedadesException(
		    Mensajes.MENSAJE_NO_EXISTE_ARCHIVO_PROPIEDADES.getMensaje(),
		    e);
	}
    }

    /**
     * Metodo que se encarga de obtener el valor de una propiedad
     * 
     * @param nombrePropiedad
     *            String que contiene el nombre de la propiedad que se desea
     *            obtener
     * @return string que contiene el valor de la propiedad, si la propiedad no
     *         existe en ninugno de los archivos de propiedades cargados retorna
     *         null
     * */
    public String obtenerValorPropiedad(String nombrePropiedad) {
	String valorPropiedad;
	valorPropiedad = this.propiedades.getProperty(nombrePropiedad);
	if (valorPropiedad != null && valorPropiedad.length() > 0) {
	    return valorPropiedad;
	}
	return null;
    }

    /**
     * Metodo que se encarga de obtener la informacion de los archivos de
     * propiedades registrados y colcarlos en un map
     * 
     * @return Map con las parejas llave valo que se encuentrane en los archivos
     *         de propiedades registrados
     * */
    public Map<String, String> obtenerListaDePropiedades() {
	Map<String, String> propiedades = new HashMap<String, String>();

	Enumeration<?> enumeradoKeys = this.propiedades.keys();
	while (enumeradoKeys.hasMoreElements()) {
	    String llave = (String) enumeradoKeys.nextElement();
	    String valor = this.propiedades.getProperty(llave);
	    propiedades.put(llave, valor);
	}

	return propiedades;
    }
}
